home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / DYN401.ZIP / dpp / istream.d < prev    next >
Text File  |  1996-09-19  |  5KB  |  246 lines

  1.  
  2. /*
  3.  *
  4.  *    Copyright (c) 1994-1996 Algorithms Corporation
  5.  *    3020 Liberty Hills Drive
  6.  *    Franklin, TN  37067
  7.  *
  8.  *    ALL RIGHTS RESERVED.
  9.  *
  10.  *
  11.  *
  12.  */
  13.  
  14.  
  15.  
  16. #include <ctype.h>
  17. #include <string.h>
  18.  
  19. #include "dpp.h"
  20.  
  21. #define MAXBUF        4096
  22. #define MAXWORDSZ    256
  23.  
  24.  
  25. #define strne(a, b)    strcmp(a, b)
  26. #define streq(a, b)    !strcmp(a, b)
  27.  
  28. #define istart(x)    (isalpha(x)  ||  (x) == '_')
  29. #define irest(x)    (isalnum(x)  ||  (x) == '_')
  30.  
  31.  
  32. #ifdef    unix
  33. #define RMODE    "r"
  34. #define WMODE    "w"
  35. #else
  36. #define RMODE    "rt"
  37. #define WMODE    "wt"
  38. #endif
  39.  
  40. defclass InputStream  {
  41.     iStream;
  42.     long    iLine;
  43.     char    *iBuf;
  44.     char    *iPtr;        
  45. };
  46.  
  47.  
  48. extern    objrtn open_file(char *file,char *mode);
  49.  
  50.  
  51. cmeth    gNew()
  52. {
  53.     return gShouldNotImplement(self, "gNew");
  54. }
  55.  
  56. cmeth    gNewWithStr(char *file)
  57. {
  58.     object    s, obj;
  59.     ivType    *iv;
  60.  
  61.     s = open_file(file, RMODE);
  62.     if (!s)
  63.         return NULL;
  64.     obj = gNew(super);
  65.     iv = ivPtr(obj);
  66.     iStream = s;
  67.     iBuf = Tnalloc(char, MAXBUF);
  68.     *iBuf = '\0';
  69.     iPtr = iBuf;
  70.     return obj;
  71. }
  72.  
  73. imeth    object    gDispose, gDeepDispose ()
  74. {
  75.     gDispose(iStream);
  76.     free(iBuf);
  77.     return gDispose(super);
  78. }
  79.  
  80. imeth    object    gGCDispose()
  81. {
  82.     free(iBuf);
  83.     return gGCDispose(super);
  84. }
  85.  
  86. /*  get a line - append continuation lines  */
  87.  
  88. static    int    get_line(ivType *iv)
  89. {
  90.     char    *tbuf;
  91.     int    something = 0, i;
  92.  
  93.     tbuf = iBuf;
  94.     *tbuf = '\0';
  95.     while (1)  {
  96.         if (!gGets(iStream, tbuf, MAXBUF-strlen(iBuf)))
  97.             break;
  98.         iLine++;
  99.         something = 1;
  100.         i = strlen(tbuf) - 1;
  101.         while (i >= 0  &&  (tbuf[i] == '\n' ||  tbuf[i] == '\r'))
  102.             i--;
  103.         if (i < 0  ||  tbuf[i] != '\\')  {
  104.             tbuf[i+1] = '\0';
  105.             break;
  106.         }
  107.         tbuf[i] = '\0';
  108.         tbuf += i;
  109.     }
  110.     return something;  /*  0=eof  */
  111. }
  112.  
  113.  
  114. #define IS(a, b)    *iPtr == a  &&  iPtr[1] == b
  115. #define IS3(a, b, c)    *iPtr == a  &&  iPtr[1] == b  &&  iPtr[2] == c
  116.  
  117. #define CODE_STATE    1
  118. #define COMMENT_STATE    2
  119.  
  120. /*  set iPtr to next non-comment token  */
  121.  
  122. static    int    next_token(ivType *iv)
  123. {
  124.     int    state = CODE_STATE;
  125.  
  126.     while (1)  {
  127.         if (!*iPtr)
  128.             if (get_line(iv))
  129.                 iPtr = iBuf;
  130.             else
  131.                 return 0; /*  no more  */
  132.         else if (state == CODE_STATE)  {
  133.             if (isspace(*iPtr))
  134.                 iPtr++;
  135.             else if (IS('/', '/'))
  136.                 *iPtr = '\0';
  137.             else if (IS('/', '*'))  {
  138.                 state = COMMENT_STATE;
  139.                 iPtr += 2;
  140.             } else
  141.                 return 1;  /*  token found  */
  142.         } else {
  143.             if (IS('*', '/'))  {
  144.                 iPtr += 2;
  145.                 state = CODE_STATE;
  146.             } else
  147.                 iPtr++;
  148.         }
  149.     }
  150. /*    return 1;   never reached  */
  151. }
  152.  
  153. imeth    gNextToken()
  154. {
  155.     char    *w, token[MAXWORDSZ];
  156.     int    i;
  157.  
  158.     if (!next_token(iv))
  159.         return NULL;
  160.     w = token;
  161.     if (istart(*iPtr))        /*  is identifier  */
  162.         for (i=0 ; ++i <= MAXWORDSZ  &&  irest(*iPtr) ;)
  163.             *w++ = *iPtr++;
  164.     else            /*  something other than an identifier  */
  165.         if (IS3('<', '<', '=')  ||
  166.             IS3('>', '>', '=')  ||
  167.             IS3(':', ':', '*')  ||     /*  C++   */
  168.             IS3('-', '>', '*')  ||     /*  C++   */
  169.             IS3('.', '.', '.'))  {
  170.             *w++ = *iPtr++;
  171.             *w++ = *iPtr++;
  172.             *w++ = *iPtr++;
  173.         } else if (IS('*', '=')  ||
  174.                IS('/', '=')  ||
  175.                IS('%', '=')  ||
  176.                IS('+', '=')  ||
  177.                IS('-', '=')  ||
  178.                IS('&', '=')  ||
  179.                IS('^', '=')  ||
  180.                IS('|', '=')  ||
  181.                IS('&', '&')  ||
  182.                IS('|', '|')  ||
  183.                IS('=', '=')  ||
  184.                IS('!', '=')  ||
  185.                IS('<', '<')  ||
  186.                IS('>', '>')  ||
  187.                IS('<', '=')  ||
  188.                IS('>', '=')  ||
  189.                IS('-', '-')  ||
  190.                IS('+', '+')  ||
  191.                IS(':', ':')  ||      /*  C++ and Dynace  */
  192.                IS('.', '*')  ||      /*  C++             */
  193.                IS('-', '>'))  {
  194.             *w++ = *iPtr++;
  195.             *w++ = *iPtr++;
  196.         } else if (*iPtr == '"'  ||  *iPtr == '\'')  {
  197.             char    type = *iPtr;
  198.             *w++ = *iPtr++;
  199.             while (*iPtr  &&  *iPtr != type)  {
  200.                 *w++ = *iPtr;
  201.                 if (*iPtr == '\\'  &&  iPtr[1])
  202.                     *w++ = *++iPtr;
  203.                 ++iPtr;
  204.             }
  205.             if (*iPtr)
  206.                 *w++ = *iPtr++;
  207.         } else if (isdigit(*iPtr)  ||  *iPtr == '.'  &&  isdigit(iPtr[1]))  {
  208.             int    hex;
  209.  
  210.             if (hex = (*iPtr == '0'  &&  (iPtr[1] == 'x'  ||  iPtr[1] == 'X')))  {
  211.                 *w++ = *iPtr++;
  212.                 *w++ = *iPtr++;
  213.             }
  214.             while ((hex ? isxdigit(*iPtr) : isdigit(*iPtr))  ||  *iPtr == '.'  ||  *iPtr == 'e'  ||  *iPtr == 'E'
  215.                    ||  ((*iPtr=='-' ||  *iPtr=='+')  &&
  216.                     (iPtr[-1] == 'e'  ||  iPtr[-1] == 'E')) )
  217.                 *w++ = *iPtr++;
  218.             if (*iPtr == 'u'  ||  *iPtr == 'U'  ||  *iPtr == 'l'  ||  *iPtr == 'L')
  219.                 *w++ = *iPtr++;
  220.             if (*iPtr == 'u'  ||  *iPtr == 'U'  ||  *iPtr == 'l'  ||  *iPtr == 'L')
  221.                 *w++ = *iPtr++;
  222.         } else
  223.             *w++ = *iPtr++;
  224.     *w = '\0';
  225.     /*  printf("Token = %s\n", token);  */
  226.     i = isspace(*iPtr)  ||  !*iPtr  ||
  227.         iPtr[0] == '/'  &&  iPtr[1] == '*'  ||
  228.         iPtr[0] == '/'  &&  iPtr[1] == '/';
  229.     return gNewToken(Token, token, iLine, i);
  230. }
  231.  
  232.  
  233.  
  234. /*
  235.  *
  236.  *    Copyright (c) 1994-1996 Algorithms Corporation
  237.  *    3020 Liberty Hills Drive
  238.  *    Franklin, TN  37067
  239.  *
  240.  *    ALL RIGHTS RESERVED.
  241.  *
  242.  *
  243.  *
  244.  */
  245.  
  246.